package festival.main;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Arrays;

import festival.board.Board;
import festival.board.Board.CoordinatePair;
import festival.board.BoardView;
import festival.board.PalaceTile;
import festival.board.RiceTile;
import festival.game.GameRunner;
import festival.input.Alert;
import festival.player.Player;
import festival.player.PlayerView;
import festival.board.IrrigationTile;
import festival.board.VillageTile;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class RunGame {
	public static void main(String[] args) {
		// GameLoader loader = new GameLoader();
		// BoardView view = new BoardView(new Board(sJavaMap));

		// MainFrame mainFrame = new MainFrame(1008, 800);
		// mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// mainFrame.getContentPane().add(view);
		// mainFrame.setVisible(true);

		 GameRunner runner = new GameRunner();
		 runner.runNewGame(3);
	    
//	    for(int i = -5; i < 10; i++) {
//	        System.out.println("i: " + i + " % 6 = " + i % 6);
//	    }

//		final Board board = new Board(sJavaMap);
//		board.updateBorderMap();
//		// final Board board = new Board(sJavaMap);
//		// for(int[] c : sJavaMap) {
//		// if((Math.random() * 100) < 90) {
//		// int type = (int) (Math.random() * 4);
//		// switch(type) {
//		// case 0 :
//		// board.placeTile(c, new RiceTile(), true);
//		// break;
//		// case 1 :
//		// board.placeTile(c, new VillageTile(), true);
//		// break;
//		// case 2 :
//		// board.placeTile(c, new IrrigationTile(), true);
//		// break;
//		// case 3 :
//		// board.placeTile(c, new PalaceTile(1), true);
//		// break;
//		// }
//		// // board.placeTile(c, new IrrigationTile(), true);
//		// }
//		// }
//		BoardView view = new BoardView(board);
//		board.addModelChangeListener(view);
//
//		Player p1 = new Player(1);
//		PlayerView pv1 = new PlayerView(p1);
//		Player p2 = new Player(2);
//		p2.useTwoSpaceTile();
//		p2.useTwoSpaceTile();
//		PlayerView pv2 = new PlayerView(p2);
//		Player p3 = new Player(3);
//		PlayerView pv3 = new PlayerView(p3);
//		Player p4 = new Player(4);
//		PlayerView pv4 = new PlayerView(p4);
//
//		JPanel jp = new JPanel();
//		jp.setLayout(new GridLayout(4, 1));
//		jp.add(pv1);
//		jp.add(pv2);
//		jp.add(pv3);
//		jp.add(pv4);
//
//		MainFrame mainFrame = new MainFrame();
//		// mainFrame.setExtendedState(mainFrame.getExtendedState()|JFrame.MAXIMIZED_BOTH);
//		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//		mainFrame.setBounds(screenSize.width / 8, screenSize.height / 8,
//				screenSize.width * 3 / 4, screenSize.height * 3 / 4);
//		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//		mainFrame.setLayout(new GridBagLayout());
//		GridBagConstraints c = new GridBagConstraints();
//		c.fill = GridBagConstraints.BOTH;
//		c.weightx = 1.0;
//		c.weighty = 1.0;
//		c.gridwidth = 1;
//		// makebutton("Button5", gridbag, c); //another row
//		// mainFrame.getContentPane().add(view);
//		mainFrame.getContentPane().add(jp, c);
//		// c.weightx = 0.9;
//		// c.gridwidth = GridBagConstraints.REMAINDER;
//		c.weightx = 4.0;
//		c.weighty = 1.0;
//		c.gridwidth = GridBagConstraints.REMAINDER;
//		mainFrame.getContentPane().add(view, c);
//		// mainFrame.getContentPane().add(pv1);
//		// mainFrame.getContentPane().add(pv2);
//		// mainFrame.getContentPane().add(pv3);
//		// mainFrame.getContentPane().add(pv4);
//		mainFrame.show();
//
//		view.requestFocusInWindow();
//
//		view.addKeyListener(new KeyListener() {
//			public void keyPressed(KeyEvent event) {
//				System.out.println(((char) event.getKeyCode() + "")
//						.toUpperCase());
//				if (event.isMetaDown()) {
//					if (event.getKeyCode() == KeyEvent.VK_W) {
//						System.exit(0);
//					}
//				}
//
//				int direction = -1;
//				switch (event.getKeyCode()) {
//				case KeyEvent.VK_R:
//					board.rotatePlacement(1);
//					break;
//				case KeyEvent.VK_T:
//					board.beginPlaceVillageTile();
//					break;
//				case KeyEvent.VK_I:
//					board.beginPlaceIrrigationTile();
//					break;
//				case KeyEvent.VK_2:
//					board.beginPlaceTwoTile();
//					break;
//				case KeyEvent.VK_3:
//					board.beginPlaceThreeTile();
//					break;
//				case KeyEvent.VK_ENTER:
//					board.placeTile();
//					break;
//				case KeyEvent.VK_ESCAPE:
//					board.clearPlacementOverlay();
//					board.clearDeveloperPlacement();
//					break;
//				case KeyEvent.VK_DOWN:
//					// System.out.println("down");
//					direction = Board.SOUTHEAST;
//					break;
//				case KeyEvent.VK_LEFT:
//					// System.out.println("left");
//					direction = Board.WEST;
//					break;
//				case KeyEvent.VK_RIGHT:
//					// System.out.println("right");
//					direction = Board.EAST;
//					break;
//				case KeyEvent.VK_UP:
//					// System.out.println("up");
//					direction = Board.NORTHWEST;
//					break;
//				case KeyEvent.VK_NUMPAD1:
//					direction = Board.SOUTHWEST;
//					break;
//				case KeyEvent.VK_NUMPAD4:
//					direction = Board.WEST;
//					break;
//				case KeyEvent.VK_NUMPAD7:
//					direction = Board.NORTHWEST;
//					break;
//				case KeyEvent.VK_NUMPAD3:
//					direction = Board.SOUTHEAST;
//					break;
//				case KeyEvent.VK_NUMPAD6:
//					direction = Board.EAST;
//					break;
//				case KeyEvent.VK_NUMPAD9:
//					direction = Board.NORTHEAST;
//					break;
//				case KeyEvent.VK_D:
//					board.beginPlaceDeveloper(1);
//					break;
//				case KeyEvent.VK_P:
//					board.placeDeveloper();
//					break;
//				case KeyEvent.VK_EQUALS:
//					board.moveDeveloper(Board.CLOCKWISE);
//					break;
//				case KeyEvent.VK_MINUS:
//					board.moveDeveloper(Board.COUNTERCLOCKWISE);
//					break;
//				case KeyEvent.VK_Q:
//					board.tabThroughDevelopers(1);
//					System.out.println(board
//							.getCurrentlySelectedDeveloperCoordinates()[0]
//							+ "  "
//							+ board.getCurrentlySelectedDeveloperCoordinates()[1]);
//					break;
//				}
//
//				if (direction != -1) {
//					board.moveOverlayTile(direction);
//					// overlay.moveTile(direction);
//					// if(board.isValid(overlay.getTileCoordinates())) {
//					// overlay.setValid(true);
//					// } else {
//					// overlay.setValid(false);
//					// }
//				}
//			}
//
//			public void keyReleased(KeyEvent arg0) {
//			}
//
//			public void keyTyped(KeyEvent arg0) {
//			}
//		});

		// int[][] map = new int[18][];
		// int theQ = 0;
		// ArrayList<Integer> row = new ArrayList<Integer>();
		// int minR = 1000;
		// int minQ = 1000;
		// for(int[] i : sJavaMap) {
		// System.out.println("axial -> q: " + i[0] + " r: " + i[1]);
		// System.out.println("cube -> x: " + i[0] + " z: " + i[1] + " y: " +
		// (-i[0] - i[1]));
		// int q = i[0] + (i[1] - (i[1]&1)) / 2;
		// int r = i[1];
		// minQ = Math.min(minQ, i[0]);
		// minR = Math.min(minR, i[1]);
		// System.out.println("odd-r -> q: " + q + " r: " + r);
		// int mq = (i[0] + 9);
		// int mr = (i[1] + 7);
		// if(theQ != mq) {
		// System.out.println(row.toString());
		// map[mq-1] = new int[row.size()];
		// int f = 0;
		// for(int z : row) {
		// map[mq-1][f] = z;
		// f++;
		// }
		// theQ = mq;
		// row = new ArrayList<Integer>();
		// }
		// row.add(mr);
		// System.out.println("mine -> q: " + mq + " r: " + mr);
		// System.out.println();
		// }
		//
		// System.out.println(row.toString());
		// map[17] = new int[row.size()];
		// int f = 0;
		// for(int z : row) {
		// map[17][f] = z;
		// f++;
		// }
		// row = new ArrayList<Integer>();
		//
		// int y = 0;
		// for(int[] m : map) {
		// System.out.print(y < 10 ? " " + y + ": " : y + ": ");
		// for(int u : m) {
		// System.out.print(u < 10 ? " " + u + ", " : u + ", ");
		// }
		// System.out.println();
		// y++;
		// }
		//
		// for(int i = 0; i <=12; i++) {
		// ArrayList<Integer> array = new ArrayList<Integer>();
		// for(int j = 0; j < map.length; j++) {
		// for(int g : map[j]) {
		// if(g == i) {
		// array.add(j);
		// }
		// }
		// }
		// }
		// int[][] theMap = new int[13][];
		// int rs = 0;
		// for(int[] ms : theMap) {
		//
		// }
		//
		//
		// System.out.println("minR: " + minR + " minQ: " + minQ);
	}

	private static int[][] sJavaMap = new int[][] {
			{ -9, 2 }, // x = -9
			{ -8, 0 },
			{ -8, 1 },
			{ -8, 2 },
			{ -8, 3 }, // x = -8
			{ -7, -1 },
			{ -7, 0 },
			{ -7, 1 },
			{ -7, 2 },
			{ -7, 3 },
			{ -7, 4 },
			{ -7, 5 }, // x = -7
			{ -6, -1 },
			{ -6, 0 },
			{ -6, 1 },
			{ -6, 2 },
			{ -6, 3 },
			{ -6, 4 }, // x = -6
			{ -5, -3 },
			{ -5, -2 },
			{ -5, -1 },
			{ -5, 0 },
			{ -5, 1 },
			{ -5, 2 },
			{ -5, 3 }, // x = -5
			{ -4, -4 },
			{ -4, -3 },
			{ -4, -2 },
			{ -4, -1 },
			{ -4, 0 },
			{ -4, 1 },
			{ -4, 2 },
			{ -4, 3 },
			{ -4, 4 },
			{ -4, 5 }, // x = -4
			{ -3, -4 },
			{ -3, -3 },
			{ -3, -2 },
			{ -3, -1 },
			{ -3, 0 },
			{ -3, 1 },
			{ -3, 2 },
			{ -3, 3 },
			{ -3, 4 }, // x = -3
			{ -2, -5 },
			{ -2, -4 },
			{ -2, -3 },
			{ -2, -2 },
			{ -2, -1 },
			{ -2, 0 },
			{ -2, 1 },
			{ -2, 2 },
			{ -2, 3 }, // x = -2
			{ -1, -6 }, { -1, -5 },
			{ -1, -4 },
			{ -1, -3 },
			{ -1, -2 },
			{ -1, -1 },
			{ -1, 0 },
			{ -1, 1 },
			{ -1, 2 },
			{ -1, 3 },
			{ -1, 4 },
			{ -1, 5 }, // x = -1
			{ 0, -7 }, { 0, -6 }, { 0, -5 }, { 0, -4 },
			{ 0, -3 },
			{ 0, -2 },
			{ 0, -1 },
			{ 0, 0 },
			{ 0, 1 },
			{ 0, 2 },
			{ 0, 3 },
			{ 0, 4 }, // x = 0
			{ 1, -7 }, { 1, -6 }, { 1, -5 }, { 1, -4 },
			{ 1, -3 },
			{ 1, -2 },
			{ 1, -1 },
			{ 1, 0 },
			{ 1, 1 },
			{ 1, 2 },
			{ 1, 3 }, // x = 1
			{ 2, -5 }, { 2, -4 }, { 2, -3 }, { 2, -2 }, { 2, -1 },
			{ 2, 0 },
			{ 2, 1 },
			{ 2, 2 },
			{ 2, 3 },
			{ 2, 4 },
			{ 2, 5 }, // x = 2
			{ 3, -6 }, { 3, -5 }, { 3, -4 }, { 3, -3 }, { 3, -2 }, { 3, -1 },
			{ 3, 0 },
			{ 3, 1 },
			{ 3, 2 },
			{ 3, 3 },
			{ 3, 4 }, // x = 3
			{ 4, -5 }, { 4, -4 }, { 4, -3 }, { 4, -2 }, { 4, -1 },
			{ 4, 0 },
			{ 4, 1 },
			{ 4, 2 },
			{ 4, 3 }, // x = 4
			{ 5, 3 }, { 5, -6 }, { 5, -5 }, { 5, -4 }, { 5, -3 }, { 5, -2 },
			{ 5, -1 }, { 5, 0 },
			{ 5, 1 },
			{ 5, 2 }, // x = 5
			{ 6, -7 }, { 6, -6 }, { 6, -5 }, { 6, -4 }, { 6, -3 }, { 6, -2 },
			{ 6, -1 }, { 6, 0 }, { 6, 1 },
			{ 6, 2 }, // x = 6
			{ 7, -7 }, { 7, -6 }, { 7, -5 }, { 7, -4 }, { 7, -3 }, { 7, -2 },
			{ 7, -1 }, { 7, 0 }, { 7, 1 }, { 7, 2 }, // x = 7
			{ 8, -4 }, { 8, -3 }, { 8, -1 }, { 8, 0 } // x = 8
	};

	private static int[][] sBorderMap = new int[][] { { 0, -7 }, { -1, -6 },
			{ -2, -5 }, { -3, -4 }, { -4, -4 }, { -5, -3 }, { -5, -2 },
			{ -6, -1 }, { -7, -1 }, { -8, 0 }, { -8, 1 }, { -9, 2 }, { -8, 2 },
			{ -8, 3 }, { -7, 3 }, { -7, 4 }, { -7, 5 }, { -6, 4 }, { -5, 3 },
			{ -4, 3 }, { -4, 4 }, { -4, 5 }, { -3, 4 }, { -2, 3 }, { -1, 3 },
			{ -1, 4 }, { -1, 5 }, { 0, 4 }, { 1, 3 }, { 2, 3 }, { 2, 4 },
			{ 2, 5 }, { 3, 4 }, { 4, 3 }, { 5, 3 }, { 6, 2 }, { 7, 2 },
			{ 7, 1 }, { 8, 0 }, { 8, -1 }, { 7, -1 }, { 7, -2 }, { 8, -3 },
			{ 8, -4 }, { 7, -4 }, { 7, -5 }, { 7, -6 }, { 7, -7 }, { 6, -7 },
			{ 5, -6 }, { 4, -5 }, { 3, -5 }, { 3, -6 }, { 2, -5 }, { 1, -5 },
			{ 1, -6 }, { 1, -7 } };

}
